<?php
require_once APP . '/application/admincontrollers/AdminAction.php';
/**
 * 文章管理
 * @package admin
 */
class ArticleController extends AdminAction
{
    
	/**
	 * Enter description here...
	 *
	 * @var Article
	 */
	private $article;
    public function init()
    {
    	require_once(APP . '/application/models/Article.php');
    	
        $this->article = new Article($this->db);
    }


    /**
     * 发送测试邮件界面
     *
     */
    public function testmailAction()
    {
    	$mid = (int)$this->getParam("mid");
    	
    	$this->view->mid = $mid;
    }
    
    /**
     * 发送测试邮件
     *
     */
    public function sendtestmailAction()
    {
    	global $cfg;
    	
    	$mid = (int)$this->getParam("mid");
    	
    	$toemail = trim($this->getParam("toemail"));
    	$title = trim($this->getParam("title"));
    	$content = trim($this->getParam("content"));    	

    	if (empty($toemail)){
    		$url = $this->url($this->view->baseUrl, "article", "testmail", "mid=" . $mid, "admin");
    		$this->showmessage($url, "接收邮件地址不能为空！");
    		exit;
    	}
    	
    	if (!ereg("^([\.a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(\.[a-zA-Z0-9_-])+",$toemail)){
    	 	$url = $this->url($this->view->baseUrl, "article", "testmail", "mid=" . $mid, "admin");
    		$this->showmessage($url, "邮箱格式错误！");
    		exit;
    	}
    	
    	if (empty($title) || empty($content)){
    		$url = $this->url($this->view->baseUrl, "article", "testmail", "mid=" . $mid, "admin");
    		$this->showmessage($url, "标题或者内容不能为空！");
    		exit;
    	}

    	// 发送邮件
    	require_once APP . '/application/models/mail/class.phpmailer.php';
    	ob_start();
    	$mail = new PHPMailer();

		if ($cfg['debug'])
			$mail->SMTPDebug = 2;
		
		require_once(APP . '/application/models/PlatsetModel.php');
		$set = new PlatsetModel($this->db);
		$set_mail = $set->getmulti(array("plat_email", "plat_emailuser", "plat_emailpwd", 'plat_smtpserver'));
		
		$mail->SMTPKeepAlive = true;
		$mail->IsSMTP();					// 启用SMTP
		$mail->Host = $set_mail['plat_smtpserver'];			//SMTP服务器
		$mail->SMTPAuth = true;		//开启SMTP认证
		$mail->Username = $set_mail['plat_email'];		// SMTP用户名
		$mail->Password = $set_mail['plat_emailpwd'];	// SMTP密码
		$mail->From = $set_mail['plat_email'];			//发件人地址
		$mail->FromName = $set_mail['plat_emailuser'];;				//发件人
		
		$mail->WordWrap = 80;					//设置每行字符长度
		
		$mail->CharSet = "utf-8";				// 这里指定字符集！
		$mail->Encoding = "base64"; 
		$mail->IsHTML(true);					// 是否HTML格式邮件
		
		$mail->AddAddress($toemail);
		$mail->Subject = $title;
		$mail->Body = $content;
		if(!$mail->Send()){			
			$log = ob_get_contents();
			ob_end_clean();
			
			if (!empty($log))
				file_put_contents(APP . '/cache/testmail.log', $log,FILE_APPEND);
			
		   $this->showmessage("", "邮件发送失败！请联系管理员");
		   return;
		}
		
		$mail->SmtpClose();
		$log = ob_get_contents();
		ob_end_clean();
		
		if (!empty($log))
			file_put_contents(APP . '/cache/testmail.log', $log,FILE_APPEND);
		
    	$this->showmessage("", "邮件发送成功！");
    }
    
    /**
     * 加载框架页
     */
    public function addAction()
    {
    	global $cfg;
    	$cid = (int)$this->getParam("cid");
    	    	
    	$sync = false;
    	    	
        $this->view->cid = $cid;
        
        if ($cid == $cfg['platcid']){
        	$this->render("addtpxw");
        }
    }
    
    /**
     * 发布新闻
     *
     */
    public function doaddAction()
    {
    	$cid = (int) $this->getParam("cid");
    	$title = $this->getParam("title");
    	$content = $this->getParam("content");
    	$pubtime = $this->getParam("pubtime");
    	$seq = (int) $this->getParam("seq");
    	
    	if (empty($title)){		
	    	$url = $this->url($this->view->baseUrl, "article", "add", "cid=" . $cid, "admin");
	    	$this->showmessage($url, '标题不能为空');
	    	return;
    	}
    	
    	if ($this->getParam("top") == 1){
    		$seq = $this->db->fetchOne("select max(seq)+1 from article where cid=" . $cid);
    	}
    	
    	/**************图片处理*********************/
    	$image = "";
    	if (!empty($_FILES) && !empty($_FILES['image']) && !empty($_FILES['image']['name'])){
    		$file_ext = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);
    		$todir = APP . '/upload';
    		if (!file_exists($todir . '/image'))
    			mkdir($todir . '/image');
    		if (!file_exists($todir . '/image/' . date("Ymd")))
    			mkdir($todir . '/image/' . date("Ymd"));
    		
    		$image = '/upload/image/' . date("Ymd") . '/' .date("YmdHis") . '_' . uniqid("h") . '.' . $file_ext;
    		move_uploaded_file($_FILES['image']['tmp_name'], APP . $image);
    	}
    	
    	$aid = $this->article->add($cid, $title, $content, $seq, $image);
    	
    	$this->view->msg = '添加成功';   		
    	$this->view->url = $this->url($this->view->baseUrl, "article", "add", "cid=" . $cid, "admin");
    	$this->showmessage();
    }
    
    /**
     * 文章管理
     *
     */
    public function listAction()
    {
    	$cid = (int) $this->getParam("cid");
    	$nowp = (int) $this->getParam("nowp", 1);
    	
    	$per_page = 20;
		
    	$result = $this->article->listArticle($cid, $nowp, $per_page);
    	
    	$this->view->cid = $cid;
    	$this->view->nowp = $nowp;
        $this->view->list = $result['list'];
        $this->view->page = $result['page'];
        $this->view->pagenum = Util::pageNumStyle($result['page']);
    }
    
    
    public function delAction()
    {
    	$aid = (int) $this->getParam("aid");
    	$cid = (int)$this->getParam("cid");
    	$nowp = (int) $this->getParam("nowp");
    	
    	$content = $this->article->show($aid);
    	$this->article->del($aid);
    	
    	$url = $this->url($this->view->baseUrl, "article", "list", "nowp=" . $nowp . '&cid=' . $cid, "admin");
    	
    	header("location:" . $url);
    }
    
    public function editAction()
    {
    	global $cfg;
    	$aid = (int) $this->getParam("aid");
    	$cid = (int)$this->getParam("cid");
    	$nowp = (int) $this->getParam("nowp");
    	$content = $this->article->show($aid);
    	        
        $this->view->cid = $cid;
        $this->view->nowp = $nowp;
        $this->view->content = $content;
        
        if ($cid == $cfg['platcid']){
        	$this->render("edittpxw");
        }
    }
    
    public function doeditAction()
    {
    	$aid = (int)$this->getParam("aid");
    	$cid = (int) $this->getParam("cid");
    	$title = $this->getParam("title");
    	$content = $this->getParam("content");
    	$seq = (int) $this->getParam("seq");
    	$delimage = $this->getParam("delimage");
    	
    	$nowp = $this->getParam("nowp");
    	    	
    	if ($this->getParam("top") == 1){
    		$seq = $this->db->fetchOne("select max(seq)+1 from article where cid=" . $cid);
    	}
    	$v['cid'] = $cid;
    	$v['title'] = $title;
    	$v['content'] = $content;
    	$v['seq'] = $seq;
    	
    	/**************图片处理*********************/
    	$image = "";
    	if (!empty($_FILES) && !empty($_FILES['image']) && !empty($_FILES['image']['name'])){
    		$file_ext = pathinfo($_FILES['image']['name'], PATHINFO_EXTENSION);
    		$todir = APP . '/upload';
    		if (!file_exists($todir . '/image'))
    			mkdir($todir . '/image');
    		if (!file_exists($todir . '/image/' . date("Ymd")))
    			mkdir($todir . '/image/' . date("Ymd"));
    		
    		$image = '/upload/image/' . date("Ymd") . '/' .date("YmdHis") . '_' . uniqid("h") . '.' . $file_ext;
    		move_uploaded_file($_FILES['image']['tmp_name'], APP . $image);
    	}
    	if (!empty($image))
    		$v['image'] = $image;
    	
    	// 删除图片
    	if (!empty($delimage))
    		$v['image'] = '';
    	
    	$this->article->change($aid, $v);    	
    	
    	$url = $this->url($this->view->baseUrl, "article", "edit", "aid=" . $aid, "admin");
    	$this->showmessage($url, "编辑成功");
    }
    
    /**
     * 给编辑器使用
     * 文件上传
     */
    public function uploadAction()
    {
    	$this->setAutoRender(false);
    			
		//文件保存目录路径
		$save_path = APP . '/upload/';
		//文件保存目录URL
		$save_url = $this->view->fullUrl . '/upload/';
		//定义允许上传的文件扩展名
		$ext_arr = array(
			'image' => array('gif', 'jpg', 'jpeg', 'png', 'bmp'),
			'flash' => array('swf', 'flv'),
			'media' => array('swf', 'flv', 'mp3', 'wav', 'wma', 'wmv', 'mid', 'avi', 'mpg', 'asf', 'rm', 'rmvb'),
			'file' => array('doc', 'docx', 'xls', 'xlsx', 'ppt', 'htm', 'html', 'txt', 'zip', 'rar', 'gz', 'bz2', 'pdf', 'pptx'),
		);
		//最大文件大小
		$max_size = 1000000;
		
		$save_path = realpath($save_path) . '/';
		
		//有上传文件时
		if (empty($_FILES) === false) {
			//原文件名
			$file_name = $_FILES['imgFile']['name'];
			//服务器上临时文件名
			$tmp_name = $_FILES['imgFile']['tmp_name'];
			//文件大小
			$file_size = $_FILES['imgFile']['size'];
			//检查文件名
			if (!$file_name) {
				alert("请选择文件。");
			}
			//检查目录
			if (@is_dir($save_path) === false) {
				alert("上传目录不存在。");
			}
			//检查目录写权限
			if (@is_writable($save_path) === false) {
				alert("上传目录没有写权限。");
			}
			//检查是否已上传
			if (@is_uploaded_file($tmp_name) === false) {
				alert("临时文件可能不是上传文件。");
			}
			//检查目录名
			$dir_name = empty($_GET['dir']) ? 'image' : trim($_GET['dir']);
			if (empty($ext_arr[$dir_name])) {
				alert("目录名不正确。");
			}
			//获得文件扩展名
			$temp_arr = explode(".", $file_name);
			$file_ext = array_pop($temp_arr);
			$file_ext = trim($file_ext);
			$file_ext = strtolower($file_ext);
			//检查扩展名
			if (in_array($file_ext, $ext_arr[$dir_name]) === false) {
				alert("上传文件扩展名是不允许的扩展名。\n只允许" . implode(",", $ext_arr[$dir_name]) . "格式。");
			}
			//创建文件夹
			if ($dir_name !== '') {
				$save_path .= $dir_name . "/";
				$save_url .= $dir_name . "/";
				if (!file_exists($save_path)) {
					mkdir($save_path);
				}
			}
			$ymd = date("Ymd");
			$save_path .= $ymd . "/";
			$save_url .= $ymd . "/";
			if (!file_exists($save_path)) {
				mkdir($save_path);
			}
			//新文件名
			$new_file_name = date("YmdHis") . '_' . rand(10000, 99999) . '.' . $file_ext;
			//移动文件
			$file_path = $save_path . $new_file_name;
			if (move_uploaded_file($tmp_name, $file_path) === false) {
				alert("上传文件失败。");
			}
			@chmod($file_path, 0644);
			$file_url = $save_url . $new_file_name;
			
			header('Content-type: text/html; charset=UTF-8');
			echo json_encode(array('error' => 0, 'url' => $file_url));
		}
    }
    
    /**
     * 给编辑器使用
     * 文件管理
     */
    public function filemanageAction()
    {
    	$this->setAutoRender(false);
    	
		//根目录路径，可以指定绝对路径，比如 /var/www/attached/
		$root_path = APP . '/upload/';
		//根目录URL，可以指定绝对路径，比如 http://www.yoursite.com/attached/
		$root_url = $this->view->fullUrl . '/upload/';
		//图片扩展名
		$ext_arr = array('gif', 'jpg', 'jpeg', 'png', 'bmp');
		
		//目录名
		$dir_name = empty($_GET['dir']) ? '' : trim($_GET['dir']);
		if (!in_array($dir_name, array('', 'image', 'flash', 'media', 'file'))) {
			echo "Invalid Directory name.";
			exit;
		}
		if ($dir_name !== '') {
			$root_path .= $dir_name . "/";
			$root_url .= $dir_name . "/";
			if (!file_exists($root_path)) {
				mkdir($root_path);
			}
		}
		
		//根据path参数，设置各路径和URL
		if (empty($_GET['path'])) {
			$current_path = realpath($root_path) . '/';
			$current_url = $root_url;
			$current_dir_path = '';
			$moveup_dir_path = '';
		} else {
			$current_path = realpath($root_path) . '/' . $_GET['path'];
			$current_url = $root_url . $_GET['path'];
			$current_dir_path = $_GET['path'];
			$moveup_dir_path = preg_replace('/(.*?)[^\/]+\/$/', '$1', $current_dir_path);
		}
		echo realpath($root_path);
		//排序形式，name or size or type
		$order = empty($_GET['order']) ? 'name' : strtolower($_GET['order']);
		
		//不允许使用..移动到上一级目录
		if (preg_match('/\.\./', $current_path)) {
			echo 'Access is not allowed.';
			exit;
		}
		//最后一个字符不是/
		if (!preg_match('/\/$/', $current_path)) {
			echo 'Parameter is not valid.';
			exit;
		}
		//目录不存在或不是目录
		if (!file_exists($current_path) || !is_dir($current_path)) {
			echo 'Directory does not exist.';
			exit;
		}
		
		//遍历目录取得文件信息
		$file_list = array();
		if ($handle = opendir($current_path)) {
			$i = 0;
			while (false !== ($filename = readdir($handle))) {
				if ($filename{0} == '.') continue;
				$file = $current_path . $filename;
				if (is_dir($file)) {
					$file_list[$i]['is_dir'] = true; //是否文件夹
					$file_list[$i]['has_file'] = (count(scandir($file)) > 2); //文件夹是否包含文件
					$file_list[$i]['filesize'] = 0; //文件大小
					$file_list[$i]['is_photo'] = false; //是否图片
					$file_list[$i]['filetype'] = ''; //文件类别，用扩展名判断
				} else {
					$file_list[$i]['is_dir'] = false;
					$file_list[$i]['has_file'] = false;
					$file_list[$i]['filesize'] = filesize($file);
					$file_list[$i]['dir_path'] = '';
					$file_ext = strtolower( pathinfo(trim($file), PATHINFO_EXTENSION));
					$file_list[$i]['is_photo'] = in_array($file_ext, $ext_arr);
					$file_list[$i]['filetype'] = $file_ext;
				}
				$file_list[$i]['filename'] = $filename; //文件名，包含扩展名
				$file_list[$i]['datetime'] = date('Y-m-d H:i:s', filemtime($file)); //文件最后修改时间
				$i++;
			}
			closedir($handle);
		}
		
		
		usort($file_list, 'cmp_func');
		
		$result = array();
		//相对于根目录的上一级目录
		$result['moveup_dir_path'] = $moveup_dir_path;
		//相对于根目录的当前目录
		$result['current_dir_path'] = $current_dir_path;
		//当前目录的URL
		$result['current_url'] = $current_url;
		//文件数
		$result['total_count'] = count($file_list);
		//文件列表数组
		$result['file_list'] = $file_list;
		
		//输出JSON字符串
		header('Content-type: application/json; charset=UTF-8');
		echo json_encode($result);
    }
}

/**
 * 编辑器使用，输出错误信息
 *
 * @param unknown_type $msg
 */
function alert($msg) {
	header('Content-type: text/html; charset=UTF-8');
	echo json_encode(array('error' => 1, 'message' => $msg));
	exit;
}

/**
 * 编辑器使用
 *
 * @param unknown_type $a
 * @param unknown_type $b
 * @return unknown
 */
function cmp_func($a, $b) {
	global $order;
	if ($a['is_dir'] && !$b['is_dir']) {
		return -1;
	} else if (!$a['is_dir'] && $b['is_dir']) {
		return 1;
	} else {
		if ($order == 'size') {
			if ($a['filesize'] > $b['filesize']) {
				return 1;
			} else if ($a['filesize'] < $b['filesize']) {
				return -1;
			} else {
				return 0;
			}
		} else if ($order == 'type') {
			return strcmp($a['filetype'], $b['filetype']);
		} else {
			return strcmp($a['filename'], $b['filename']);
		}
	}
}